package com.xinzhi.service.impl;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.api.R;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xinzhi.domain.Product;
import com.xinzhi.domain.ProductType;
import com.xinzhi.domain.dto.AddProductDto;
import com.xinzhi.domain.dto.QueryProductDto;
import com.xinzhi.domain.dto.UpdateProductDto;
import com.xinzhi.domain.vo.*;
import com.xinzhi.mapper.ProductMapper;
import com.xinzhi.mapper.ProductTypeMapper;
import com.xinzhi.service.ProductService;
import com.xinzhi.utils.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class ProductServiceImpl implements ProductService {

    @Resource
    ProductMapper productMapper;

    @Resource
    ProductTypeMapper productTypeMapper;


    @Override
    public Result getAllProduct() {
        return Result.ok(productMapper.selectList(null));
    }

    /**
     * 根据 id 获取商品详情
     * @param id
     * @return
     */
    @Override
    public Result getProductDetail(String id) {
        if (id == null || id ==""){
            return Result.error("参数为空");
        }
        Integer integer = Integer.valueOf(id);
        Product productById = productMapper.findProductById(integer);
        if (ObjectUtil.isEmpty(productById)){
            return Result.error(50003,"商品不存在");
        }
        ProductVo productVo = new ProductVo();
        productVo.setId(productById.getId());
        productVo.setProductName(productById.getProductName());
        productVo.setPrice(productById.getPrice());
        productVo.setMainImg(productById.getMainImg());
        productVo.setContent(productById.getContent());
        productVo.setTjly(productById.getTjly());
        productVo.setShelfLife(productById.getShelfLife());
        productVo.setOrigin(productById.getOrigin());
        productVo.setSpecification(productById.getSpecification());
        productVo.setMfgd(productById.getMfgd());
        productVo.setSavingMode(productById.getSavingMode());
        productVo.setBrand(productById.getBrand());
        productVo.setSalesVolume(productById.getSalesVolume());
        productVo.setColOneId(productById.getColOneId());
        productVo.setColId(productById.getColId());
        return Result.ok(productVo);
    }

    //==============
    @Override
    public Result getProductByTwoType(String twoTypeId,String current) {

        // 判空
        if (twoTypeId == null || twoTypeId ==""){
            return Result.error("参数为空");
        }
        // 转换参数类型
        Integer typeId = Integer.valueOf(twoTypeId);
        // 页数
        Integer tempCurrent;
        if (current == null || current == ""){
            tempCurrent = 1;
        }else {
            tempCurrent = Integer.valueOf(current);
        }
        // 如果页数小于 1  置为1
        if (tempCurrent < 1){
            tempCurrent = 1;
        }
        QueryWrapper wrapper = new QueryWrapper();
        // 使用 Map 集合映射条件
        Map<String,Integer> map = new HashMap<>();
        map.put("col_id",typeId);
        map.put("delete_status",0);
        map.put("putaway_status",1);
        wrapper.allEq(map);
        Page<Product> productPage = new Page<>(tempCurrent,8);
        Page page = productMapper.selectPage(productPage, wrapper);
        // 获取分页得到的内容
        List<Product> productList = page.getRecords();
        // 商品简介
        List<ProductIntroVo> productIntroVoList = new ArrayList<>();
        // 遍历赋值
        for (Product product : productList) {
            ProductIntroVo productIntroVo = new ProductIntroVo();
            productIntroVo.setId(product.getId());
            productIntroVo.setProductName(product.getProductName());
            productIntroVo.setMainImg(product.getMainImg());
            productIntroVo.setPrice(product.getPrice());
            productIntroVo.setSalesVolume(product.getSalesVolume());
            productIntroVoList.add(productIntroVo);
        }

        // 封装返回信息
        TwoTypeProductVo twoTypeProductVo = new TwoTypeProductVo();
        // 当前页
        twoTypeProductVo.setCurrent(page.getCurrent());
        // 总页数
        twoTypeProductVo.setPages(page.getPages());
        // 总记录数
        twoTypeProductVo.setTotal(page.getTotal());
        // 每页记录数
        twoTypeProductVo.setSize(page.getSize());
        // 分页信息
        twoTypeProductVo.setProductIntroVo(productIntroVoList);

//        Page<ProductIntroVo> productIntroVoPage = new Page<>(1,6);
        return Result.ok(twoTypeProductVo);

    }

    @Override
    public Result getProductByOneType(String oneTypeId) {
        // 判空
        if (oneTypeId == null || oneTypeId ==""){
            // 如果为空，返回六条商品数据
            return Result.ok(productMapper.getProductByOneTypeNull());
        }
        // 不为空转换参数类型
        Integer typeId = Integer.valueOf(oneTypeId);
        List<ProductIntroVo> productByOneType = productMapper.getProductByOneType(typeId);
        return Result.ok(productByOneType);
    }

    @Override
    public Result getProductBySalesVolumeTop() {
        return Result.ok(productMapper.getProductBySalesVolume());
    }

    /**
     * 添加商品
     * @param addProductDto         添加商品的请求参数
     * @return
     */
    @Override
    public Result addProduct(AddProductDto addProductDto) {
        // 参数校验
        if (!(verifyProductDto(addProductDto))) {
            return Result.error(50001,"参数校验失败");
        }
        // 创建 Product 对象
        Product product = new Product();
        // 查询商品类目（查询对应的一级类目 id）
        ProductType productType = productTypeMapper.queryProductTypeById(addProductDto.getColId());

        // 赋值
        product.setProductName(addProductDto.getProductName());
        product.setPrice(addProductDto.getPrice());
        product.setMainImg(addProductDto.getMainImg());
        product.setContent(addProductDto.getContent());
        product.setTjly(addProductDto.getTjly());
        product.setShelfLife(addProductDto.getShelfLife());
        product.setOrigin(addProductDto.getOrigin());
        product.setSpecification(addProductDto.getSpecification());
        product.setMfgd(addProductDto.getMfgd());
        product.setSavingMode(addProductDto.getSavingMode());
        product.setBrand(addProductDto.getBrand());
        product.setSalesVolume(0);
        product.setStock(addProductDto.getStock());
        product.setColId(addProductDto.getColId());
        product.setDeleteStatus(0);
        product.setPutawayStatus(addProductDto.getPutawayStatus());
        product.setColOneId(productType.getFatherTypeId());
        Integer integer = productMapper.addProduct(product);
        if (integer == 0){
            return Result.error(50002,"添加失败");
        }
        return Result.ok("商品已成功添加");
    }

    @Override
    public Result productManage(String current) {
        /**
         * 管理员访问商品管理页面
         * 返回参数信息
         *   page：  总记录数 总页数 当前页 每页记录数
         *   parameter:  二级类目名 商品名 价格 销量 库存 上架状态
         */
        // 默认访问第一页
        Integer tempCurrent = 1;
        // 如果传入参数  转换参数类型
        if (current != null && current != ""){
            tempCurrent = Integer.valueOf(current);
        }
        // 查询商品信息
        QueryWrapper wrapper = new QueryWrapper();
        wrapper.eq("delete_status",0);
        Page<Product> productPage = new Page<>(tempCurrent,10);
        Page page = productMapper.selectPage(productPage, wrapper);
        List<Product> productList = page.getRecords();
        // 创建视图对象属性
        List<AdminProductIntroVo> adminProductIntroVoList = new ArrayList<>();
        // 遍历查询出的商品信息
        for (Product product : productList) {
            AdminProductIntroVo adminProductIntroVo = new AdminProductIntroVo();
            // 获取类目名
            adminProductIntroVo.setProductTypeName(productTypeMapper.queryProductTypeName(product.getId()));
            adminProductIntroVo.setPrice(product.getPrice());
            adminProductIntroVo.setProductName(product.getProductName());
            adminProductIntroVo.setStock(product.getStock());
            adminProductIntroVo.setPutawayStatus(product.getPutawayStatus());
            adminProductIntroVo.setSalesVolume(product.getSalesVolume());
            // 追加到集合中
            adminProductIntroVoList.add(adminProductIntroVo);
        }


        // 封装返回参数
        AdminProductVo adminProductVo = new AdminProductVo();
        // 当前页
        adminProductVo.setCurrent(page.getCurrent());
        // 总页数
        adminProductVo.setPages(page.getPages());
        // 每页记录数
        adminProductVo.setSize(page.getSize());
        // 总记录数
        adminProductVo.setTotal(page.getTotal());
        // 当前页信息
        adminProductVo.setAdminProductIntroVoList(adminProductIntroVoList);

        return Result.ok(adminProductVo);
    }

    @Override
    public Result productDetail(String id) {
        // 参数校验
        if (id == null || id == ""){
            return Result.error(50001,"请求参数错误");
        }
        // 转换参数类型
        Integer tempId = Integer.valueOf(id);
        Product productById = productMapper.queryProductDetailById(tempId);
        return Result.ok(productById);
    }

    @Override
    public Result updateProduct(UpdateProductDto updateProductDto) {
        // 修改商品内容接口  所有修改都使用此接口
        // 参数校验
        // 判断传入对象是否为空
        if (ObjectUtil.isEmpty(updateProductDto)){
            return Result.error(50001,"请求参数为空");
        }
        if (updateProductDto.getId() == 0 || updateProductDto.getId() ==null){
            return Result.error(50002,"请求 ID 为空");
        }

        // 将请求参数赋值给实体类
        Product product = new Product();
        product.setId(updateProductDto.getId());
        product.setProductName(updateProductDto.getProductName());
        product.setPrice(updateProductDto.getPrice());
        product.setMainImg(updateProductDto.getMainImg());
        product.setContent(updateProductDto.getContent());
        product.setTjly(updateProductDto.getTjly());
        product.setShelfLife(updateProductDto.getShelfLife());
        product.setOrigin(updateProductDto.getOrigin());
        product.setSpecification(updateProductDto.getSpecification());
        product.setMfgd(updateProductDto.getMfgd());
        product.setSavingMode(updateProductDto.getSavingMode());
        product.setBrand(updateProductDto.getBrand());
        product.setSalesVolume(updateProductDto.getSalesVolume());
        product.setStock(updateProductDto.getStock());
        if (updateProductDto.getColId() != 0){
            ProductType productType = productTypeMapper.queryProductTypeById(updateProductDto.getColId());
            product.setColId(updateProductDto.getColId());
            product.setColOneId(productType.getFatherTypeId());
        }

        Integer integer = productMapper.updateProduct(product);
        if (integer == 0){
            return Result.error(50005,"系统异常请求失败");
        }
        return Result.ok("修改成功");
    }

    @Override
    public Result queryProduct(QueryProductDto queryProductDto) {
        // 根据请求参数动态查询
        // 参数校验
        if (ObjectUtil.isEmpty(queryProductDto)){
            return Result.error(50001,"请求参数为空");
        }
        // 创建wrapper
        QueryWrapper<Product> wrapper = new QueryWrapper();
        if (queryProductDto.getProductName() != null && queryProductDto.getProductName() != ""){
            wrapper.like("product_name",queryProductDto.getProductName());
        }
        if (queryProductDto.getColId() != null && queryProductDto.getColId() != 0){
            wrapper.eq("col_id",queryProductDto.getColId());
        }
        if (queryProductDto.getPutawayStatus() != null && queryProductDto.getColId() >= 0 && queryProductDto.getPutawayStatus() <= 1){
            wrapper.eq("putaway_status",queryProductDto.getPutawayStatus());
        }
        Integer tempCurrent = 1;
        if (queryProductDto.getCurrent() != null && queryProductDto.getCurrent() != 0)
            tempCurrent = queryProductDto.getCurrent();
        // 分页查询
        Page<Product> productPage = new Page<>(tempCurrent,10);
        Page page = productMapper.selectPage(productPage, wrapper);
        List<Product> productList = page.getRecords();
        // 创建视图对象属性
        List<AdminProductIntroVo> adminProductIntroVoList = new ArrayList<>();
        // 遍历查询出的商品信息
        for (Product product : productList) {
            AdminProductIntroVo adminProductIntroVo = new AdminProductIntroVo();
            // 获取类目名
            adminProductIntroVo.setProductTypeName(productTypeMapper.queryProductTypeName(product.getId()));
            adminProductIntroVo.setPrice(product.getPrice());
            adminProductIntroVo.setProductName(product.getProductName());
            adminProductIntroVo.setStock(product.getStock());
            adminProductIntroVo.setPutawayStatus(product.getPutawayStatus());
            adminProductIntroVo.setSalesVolume(product.getSalesVolume());
            // 追加到集合中
            adminProductIntroVoList.add(adminProductIntroVo);
        }
        // 封装返回参数
        AdminProductVo adminProductVo = new AdminProductVo();
        // 当前页
        adminProductVo.setCurrent(page.getCurrent());
        // 总页数
        adminProductVo.setPages(page.getPages());
        // 每页记录数
        adminProductVo.setSize(page.getSize());
        // 总记录数
        adminProductVo.setTotal(page.getTotal());
        // 当前页信息
        adminProductVo.setAdminProductIntroVoList(adminProductIntroVoList);

        return Result.ok(adminProductVo);
    }

    @Override
    public Result delProduct(String id) {
        // 参数校验
        if(id == null || id == ""){
            return Result.error(50001,"请求参数为空");
        }
        // 转换参数类型
        Integer tempId = Integer.valueOf(id);

        // 判断数据库中是否存在该商品
        Product productById = productMapper.findProductById(tempId);
        if (ObjectUtil.isEmpty(productById) || productById.getDeleteStatus() == 1){
            return Result.error(50002,"商品不存在");
        }

        // 将请求参数放入 product
        Product product = new Product();
        product.setId(tempId);
        product.setDeleteStatus(1);
        Integer integer = productMapper.updateProduct(product);
        if (integer == 0){
            return Result.error(50003,"系统异常");
        }
        return Result.ok("商品成功移除");
    }

    @Override
    public Result putAwayOrOutOfProduct(String id, String putAwayStatus) {
        // 参数校验
        if (id == null || id == "" || putAwayStatus == null || putAwayStatus == ""){
            return Result.error(50001,"请求参数不能为空");
        }
        // 转换参数类型
        Integer tempId = Integer.valueOf(id);
        Integer tempPutAway = Integer.valueOf(putAwayStatus);
        if (tempPutAway != 0 && tempPutAway != 1){
            return Result.error(50002,"请求参数不符 1、上架 2、下架");
        }
        Product product = productMapper.adminQueryProductById(tempId);
        if (ObjectUtil.isEmpty(product)){
            return Result.error(50003,"商品不存在");
        }
        if (product.getPutawayStatus() == tempPutAway){
            return Result.error(50004,"商品已下架/上架");
        }

        // 创建 product 对象接收修改内容
        Product product1 = new Product();
        product1.setId(tempId);
        product1.setPutawayStatus(tempPutAway);
        // 调用动态 SQL 修改上架状态
        Integer integer = productMapper.updateProduct(product1);
        if (integer == 0){
            return Result.error(50005,"系统异常，修改失败");
        }
        if  (tempPutAway == 0){
            return Result.ok("修改成功 已下架");
        }
        return Result.ok("修改成功 已上架");
    }


    /**
     *  校验请求参数
     * @param addProductDto
     * @return
     */
    public Boolean verifyProductDto(AddProductDto addProductDto){
        if (ObjectUtil.isEmpty(addProductDto)){
            return false;
        }
        if (addProductDto.getProductName() == null || addProductDto.getProductName() == ""){
            return false;
        }
        // 判断价格是否符合标准  两位小数
        // 将价格转换为 String
        String tempPrice = String.valueOf(addProductDto.getPrice());
        // 获取小数点位置
        int i = tempPrice.indexOf(".");
        // 截取小数点后的字符串
        String ba = tempPrice.substring(i+1,tempPrice.length());
        // 判端小数点后面的有几个字符
        if (ba.length() > 2){
            return false;
        }

        if (addProductDto.getMainImg() == null || addProductDto.getMainImg() == ""){
            return false;
        }
        if (addProductDto.getContent() == null || addProductDto.getContent() == ""){
            return false;
        }
        if (addProductDto.getTjly() == null || addProductDto.getTjly() == ""){
            return false;
        }if (addProductDto.getShelfLife() == null || addProductDto.getShelfLife() == ""){
            return false;
        }
        if (addProductDto.getOrigin() == null || addProductDto.getOrigin() == ""){
            return false;
        }if (addProductDto.getSpecification() == null || addProductDto.getSpecification() == ""){
            return false;
        }
        if (addProductDto.getMfgd() == null || addProductDto.getMfgd() == ""){
            return false;
        }
        if (addProductDto.getSavingMode() == null || addProductDto.getSavingMode() == ""){
            return false;
        }

        if (addProductDto.getStock() == null){
            return false;
        }
        if (addProductDto.getPutawayStatus() == null){
            return false;
        }
        // 类别校验  必须为二级分类
        if (addProductDto.getColId() == null || addProductDto.getColId() == 0 ){
            return false;
        }
        ProductType productType = productTypeMapper.queryProductTypeById(addProductDto.getColId());
        if (ObjectUtil.isEmpty(productType)){
            return false;
        }


        return true;

    }


}
